package com.young.launch_task_init.core.util

import com.young.launch_task_init.core.Constant
import com.young.launch_task_init.core.group.BaseTaskGroup
import com.young.launch_task_init.core.log.ILog
import com.young.launch_task_init.core.log.SimpleLog
import com.young.launch_task_init.core.task.AsynTask
import com.young.launch_task_init.core.task.base.ITask

/**
 * Author：young
 * .
 * Time： 1/4/2023 下午4:47 周六
 * .
 * Desc：打印任务测试信息工具类
 */
class PrintTestInfoUtil {


    /**
     * 打印任务在什么线程执行
     *
     * @param group 任务组
     * @param task 任务
     *
     */
    fun printTaskDoOnThread(group: BaseTaskGroup<*>, task: ITask) {
        if (isShowLog()) {
            val strBuilder = StringBuilder()
            strBuilder
                .append("任务执行信息：")
                .append("任务组=${group.getName()} ")
                .append("任务=${task.getName()} ")
                .append("线程调度器=${task.getCoroutineDispatcher()} ")
                .append("执行线程=${Thread.currentThread().name} ")
                .append("第三方初始化是否需要异步=${task is AsynTask}")

            getLog().logD(
                Constant.LOG_TAG,
                strBuilder.toString()
            )
        }
    }

    /**
     * 每个任务组任务完成进度
     *
     * @param group 任务组
     * @param task 任务
     * @param curProgress 任务组已完成任务个数
     * @param maxProgress 任务组任务总个数
     *
     */
    fun printPerTaskGroupCompletedProgress(
        group: BaseTaskGroup<*>,
        task: ITask,
        curProgress: Int,
        maxProgress: Int
    ) {
        if (isShowLog()) {
            val strBuilder = StringBuilder()
            strBuilder.append("每个任务组任务完成进度：")
                .append("任务组=${group.getName()} ")
                .append("任务=${task.getName()} ")
                .append("任务组已完成任务个数=$curProgress ")
                .append("任务组任务总个数=$maxProgress ")
                .append("进度=${curProgress}/${maxProgress} ")

            getLog().logD(
                Constant.LOG_TAG,
                strBuilder.toString()
            )
        }
    }


    /**
     * 打印总的任务完成进度（所有任务聚合的完成任务进度）
     *
     * @param task 当前执行完成的任务
     * @param taskGroup 当前执行任务所属的任务组
     * @param curProgress 当前已完成的任务个数
     * @param maxProgress 总的任务个数
     */
    fun printTotalCompletedProgress(
        task: ITask,
        taskGroup: BaseTaskGroup<*>,
        curProgress: Int,
        maxProgress: Int
    ) {
        if (isShowLog()) {
            val strBuilder = StringBuilder()
            strBuilder.append("总的任务完成进度（所有任务聚合的完成任务进度）：")
                .append("任务组=${taskGroup.getName()} ")
                .append("任务=${task.getName()} ")
                .append("已完成任务个数=$curProgress ")
                .append("任务总个数=$maxProgress ")
                .append("进度=${curProgress}/${maxProgress} ")

            getLog().logD(
                Constant.LOG_TAG,
                strBuilder.toString()
            )
        }
    }

    /**
     * 打印任务组的完成进度
     *
     * @param group 任务组
     * @param curProgress 任务组已完成个数
     * @param maxProgress 任务组总个数
     *
     */
    fun printTaskGroupCompletedProgress(
        group: BaseTaskGroup<*>,
        curProgress: Int,
        maxProgress: Int
    ) {
        if (isShowLog()) {
            val strBuilder = StringBuilder()
            strBuilder.append("任务组完成进度：")
                .append("任务组=${group.getName()} ")
                .append("任务组已完成个数=$curProgress ")
                .append("任务组总个数=$maxProgress ")
                .append("进度=${curProgress}/${maxProgress} ")

            getLog().logD(
                Constant.LOG_TAG,
                strBuilder.toString()
            )
        }
    }

    /**
     * 打印所有任务完成
     *
     * @param time 任务执行完成耗时，单位：ms
     */
    fun printAllTaskComplete(time: Long) {
        if (isShowLog()) {
            // 1 秒
            val oneSecond = 1000

            val strBuilder = StringBuilder()
            if (time <= oneSecond) {
                strBuilder.append(time).append("ms")
            } else {
                val second = time / oneSecond
                val millis = time % oneSecond
                strBuilder.append(second).append("s ").append(millis).append("ms")
            }
            getLog().logE(
                Constant.LOG_TAG,
                "全部任务执行完成，耗时：${strBuilder}"
            )
        }
    }

    /**
     * 获取日志输出类
     */
    private fun getLog(): ILog {
        return SimpleLog
    }

    /**
     * 是否展示日志
     */
    private fun isShowLog(): Boolean {
        return getLog().isShowLog()
    }
}